/*eslint-disable*/
// uview ui 校验规则:
const test = uni.$u.test

export default {
  $isString(val: any) {
    return Object.prototype.toString.call(val) === '[object String]'
  },
  // 字符串是否包含某个值
  $isStrContains(val: any, str: any) {
    return test.contains(val, str)
  },
  //  当弱网还没拿到服务端数字的字段 则该val为undefined 应该结合v-if判断不显示undefined 也因为价格故此封装'0' 和 0 的排除方法
  $isNumberZero(val: string | number) {
    return val || val === '0' || val === 0
  },
  // 判断是否为数组并且length>1
  $isNotTempArr(val: string | any[]) {
    return Array.isArray(val) && val.length > 0
  },
  // 判断是否为 空对象
  $isNotTempObject(val: {}) {
    return test.object(val) && Object.keys(val).length > 0
  },
  // 判断是否为 对象
  $isObject(val: any) {
    return test.object(val)
  },
  // 判断是否为 map
  $isMap(val: any) {
    return Object.prototype.toString.call(val) === '[object Map]'
  },

  // 判断字符串长度是否在一定范围内
  $strRangeLength(val: any, arr: any) {
    return test.rangeLength(val, arr)
  },
  // 判断字符串是否json
  $isJSON(val: any) {
    return test.jsonString(val)
  },
  // 是否身份证号
  $isIdCard(val: any) {
    return test.idCard(val)
  },
  // 判断是否邮箱号
  $isEmail(val: any) {
    return test.email(val)
  },
  // 判断是否手机号
  $isMobile(val: any) {
    return test.mobile(val)
  },
  // 判断是否金额
  $isAmount(val: any) {
    let res = val
    if (typeof val === 'string') {
      res = Number(val)
    }
    return test.amount(res)
  },
  // 以下是自己的校验规则
  // 表单校验字符长度的方法
  $validLength(
    value: string | any[],
    callback: (arg0: Error | undefined) => any,
    length: number
  ) {
    if (value.length <= length) {
      // @ts-expect-error
      return callback()
    } else {
      return callback(new Error(`字符长度不能超过${length}个`))
    }
  },

  // 表单校验真实姓名的方法
  $realPersonName(value: string, callback: (arg0: Error | undefined) => any) {
    const regIdNo = /^[\u4e00-\u9fa5]{2,4}$/
    if (regIdNo.test(value)) {
      // @ts-expect-error
      return callback()
    } else {
      return callback(new Error('请填写真实姓名'))
    }
  },

  // 正整数
  $NumberBaseRules(value: number, callback: (arg0: Error | undefined) => any) {
    value = Number(value) // 因为v-model是必定是字符串进来的 所以用Number和isNaN协同判断 1.20
    if (!isNaN(value)) {
      if (value <= 0) {
        // 可以自己更改
        return callback(new Error('不能填入负数或0'))
      } else {
        // @ts-expect-error
        return callback()
      }
    } else {
      return callback(new Error('必须填入数字'))
    }
  },

  // 必须填入数字
  $NumberRules(value: number, callback: (arg0: Error | undefined) => any) {
    value = Number(value) // 因为v-model是必定是字符串进来的 所以用Number和isNaN协同判断 1.20
    if (!isNaN(value)) {
      // @ts-expect-error
      return callback()
    } else {
      return callback(new Error('必须填入数字'))
    }
  },

  // 大小写字母+数字+特殊字符
  $PwdRules(value: string, callback: (arg0: Error | undefined) => any) {
    const reg =
      /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]+$/
    if (reg.test(value)) {
      // @ts-expect-error
      return callback()
    } else {
      return callback(new Error('需大小写字母+数字+特殊字符三种及以上组合'))
    }
  }
}
